<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/Python-3.6.2/Include/traceback.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/Python-3.6.2/Include/traceback.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> 
<a name="2" /><span class="True">       2:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="macros_noref.html#_UHlfVFJBQ0VCQUNLX0hfMA__"><span class="b">Py_TRACEBACK_H</span></a>
<a name="3" /><span class="True">       3:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlfVFJBQ0VCQUNLX0hfMA__"><span class="b">Py_TRACEBACK_H</span></a>
<a name="4" /><span class="False">       4:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="5" /><span class="False">       5:</span> <span class="m">extern</span> <span class="e">&quot;C&quot;</span> <span class="f">{</span>
<a name="6" /><span class="True">       6:</span> <span class="f">#</span><span class="n">endif</span>
<a name="7" /><span class="True">       7:</span> 
<a name="8" /><span class="True">       8:</span> <span class="f">#</span><span class="n">include</span> <span class="e">&quot;pystate.h&quot;</span>
<a name="9" /><span class="True">       9:</span> 
<a name="10" /><span class="True">      10:</span> <span class="m">struct</span> <span class="b">_frame</span><span class="f">;</span>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="True">      12:</span> <span class="k">/* Traceback interface */</span>
<a name="13" /><span class="True">      13:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="14" /><span class="True">      14:</span> <span class="m">typedef</span> <span class="m">struct</span> <span class="b">_traceback</span> <span class="f">{</span>
<a name="15" /><span class="True">      15:</span>     <a href="macros_ref.html#_UHlPYmplY3RfSEVBRF8w"><span class="b">PyObject_HEAD</span></a>
<a name="16" /><span class="True">      16:</span>     <span class="m">struct</span> <span class="b">_traceback</span> <span class="f">*</span><span class="b">tb_next</span><span class="f">;</span>
<a name="17" /><span class="True">      17:</span>     <span class="m">struct</span> <span class="b">_frame</span> <span class="f">*</span><span class="b">tb_frame</span><span class="f">;</span>
<a name="18" /><span class="True">      18:</span>     <span class="m">int</span> <span class="b">tb_lasti</span><span class="f">;</span>
<a name="19" /><span class="True">      19:</span>     <span class="m">int</span> <span class="b">tb_lineno</span><span class="f">;</span>
<a name="20" /><span class="True">      20:</span> <span class="f">}</span> <span class="b">PyTracebackObject</span><span class="f">;</span>
<a name="21" /><span class="True">      21:</span> <span class="f">#</span><span class="n">endif</span>
<a name="22" /><span class="True">      22:</span> 
<a name="23" /><span class="True">      23:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyTraceBack_Here</span><span class="f">(</span><span class="m">struct</span> <span class="b">_frame</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="24" /><span class="True">      24:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">PyTraceBack_Print</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">)</span><span class="f">;</span>
<a name="25" /><span class="True">      25:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="26" /><span class="True">      26:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">int</span><span class="f">)</span> <span class="b">_Py_DisplaySourceLine</span><span class="f">(</span><span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">,</span> <span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="27" /><span class="True">      27:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_PyTraceback_Add</span><span class="f">(</span><span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="m">const</span> <span class="m">char</span> <span class="f">*</span><span class="f">,</span> <span class="m">int</span><span class="f">)</span><span class="f">;</span>
<a name="28" /><span class="True">      28:</span> <span class="f">#</span><span class="n">endif</span>
<a name="29" /><span class="True">      29:</span> 
<a name="30" /><span class="True">      30:</span> <span class="k">/* Reveal traceback type so we can typecheck traceback objects */</span>
<a name="31" /><span class="True">      31:</span> <a href="macros_ref.html#_UHlBUElfREFUQV8w"><span class="b">PyAPI_DATA</span></a><span class="f">(</span><span class="b">PyTypeObject</span><span class="f">)</span> <span class="b">PyTraceBack_Type</span><span class="f">;</span>
<a name="32" /><span class="True">      32:</span> <span class="f">#</span><span class="n">define</span> <a href="macros_noref.html#_UHlUcmFjZUJhY2tfQ2hlY2tfMA__"><span class="b">PyTraceBack_Check</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span> <span class="f">(</span><a href="macros_ref.html#_UHlfVFlQRV8w"><span class="b">Py_TYPE</span></a><span class="f">(</span><span class="b">v</span><span class="f">)</span> <span class="f">==</span> <span class="f">&amp;</span><span class="b">PyTraceBack_Type</span><span class="f">)</span>
<a name="33" /><span class="True">      33:</span> 
<a name="34" /><span class="True">      34:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="35" /><span class="True">      35:</span> <span class="k">/* Write the Python traceback into the file &apos;fd&apos;. For example:</span>
<a name="36" /><span class="True">      36:</span> <span class="k"></span>
<a name="37" /><span class="True">      37:</span> <span class="k">       Traceback (most recent call first):</span>
<a name="38" /><span class="True">      38:</span> <span class="k">         File &quot;xxx&quot;, line xxx in &lt;xxx&gt;</span>
<a name="39" /><span class="True">      39:</span> <span class="k">         File &quot;xxx&quot;, line xxx in &lt;xxx&gt;</span>
<a name="40" /><span class="True">      40:</span> <span class="k">         ...</span>
<a name="41" /><span class="True">      41:</span> <span class="k">         File &quot;xxx&quot;, line xxx in &lt;xxx&gt;</span>
<a name="42" /><span class="True">      42:</span> <span class="k"></span>
<a name="43" /><span class="True">      43:</span> <span class="k">   This function is written for debug purpose only, to dump the traceback in</span>
<a name="44" /><span class="True">      44:</span> <span class="k">   the worst case: after a segmentation fault, at fatal error, etc. That&apos;s why,</span>
<a name="45" /><span class="True">      45:</span> <span class="k">   it is very limited. Strings are truncated to 100 characters and encoded to</span>
<a name="46" /><span class="True">      46:</span> <span class="k">   ASCII with backslashreplace. It doesn&apos;t write the source code, only the</span>
<a name="47" /><span class="True">      47:</span> <span class="k">   function name, filename and line number of each frame. Write only the first</span>
<a name="48" /><span class="True">      48:</span> <span class="k">   100 frames: if the traceback is truncated, write the line &quot; ...&quot;.</span>
<a name="49" /><span class="True">      49:</span> <span class="k"></span>
<a name="50" /><span class="True">      50:</span> <span class="k">   This function is signal safe. */</span>
<a name="51" /><span class="True">      51:</span> 
<a name="52" /><span class="True">      52:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_Py_DumpTraceback</span><span class="f">(</span>
<a name="53" /><span class="True">      53:</span>     <span class="m">int</span> <span class="b">fd</span><span class="f">,</span>
<a name="54" /><span class="True">      54:</span>     <span class="b">PyThreadState</span> <span class="f">*</span><span class="b">tstate</span><span class="f">)</span><span class="f">;</span>
<a name="55" /><span class="True">      55:</span> 
<a name="56" /><span class="True">      56:</span> <span class="k">/* Write the traceback of all threads into the file &apos;fd&apos;. current_thread can be</span>
<a name="57" /><span class="True">      57:</span> <span class="k">   NULL.</span>
<a name="58" /><span class="True">      58:</span> <span class="k"></span>
<a name="59" /><span class="True">      59:</span> <span class="k">   Return NULL on success, or an error message on error.</span>
<a name="60" /><span class="True">      60:</span> <span class="k"></span>
<a name="61" /><span class="True">      61:</span> <span class="k">   This function is written for debug purpose only. It calls</span>
<a name="62" /><span class="True">      62:</span> <span class="k">   _Py_DumpTraceback() for each thread, and so has the same limitations. It</span>
<a name="63" /><span class="True">      63:</span> <span class="k">   only write the traceback of the first 100 threads: write &quot;...&quot; if there are</span>
<a name="64" /><span class="True">      64:</span> <span class="k">   more threads.</span>
<a name="65" /><span class="True">      65:</span> <span class="k"></span>
<a name="66" /><span class="True">      66:</span> <span class="k">   If current_tstate is NULL, the function tries to get the Python thread state</span>
<a name="67" /><span class="True">      67:</span> <span class="k">   of the current thread. It is not an error if the function is unable to get</span>
<a name="68" /><span class="True">      68:</span> <span class="k">   the current Python thread state.</span>
<a name="69" /><span class="True">      69:</span> <span class="k"></span>
<a name="70" /><span class="True">      70:</span> <span class="k">   If interp is NULL, the function tries to get the interpreter state from</span>
<a name="71" /><span class="True">      71:</span> <span class="k">   the current Python thread state, or from</span>
<a name="72" /><span class="True">      72:</span> <span class="k">   _PyGILState_GetInterpreterStateUnsafe() in last resort.</span>
<a name="73" /><span class="True">      73:</span> <span class="k"></span>
<a name="74" /><span class="True">      74:</span> <span class="k">   It is better to pass NULL to interp and current_tstate, the function tries</span>
<a name="75" /><span class="True">      75:</span> <span class="k">   different options to retrieve these informations.</span>
<a name="76" /><span class="True">      76:</span> <span class="k"></span>
<a name="77" /><span class="True">      77:</span> <span class="k">   This function is signal safe. */</span>
<a name="78" /><span class="True">      78:</span> 
<a name="79" /><span class="True">      79:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">const</span> <span class="m">char</span><span class="f">*</span><span class="f">)</span> <span class="b">_Py_DumpTracebackThreads</span><span class="f">(</span>
<a name="80" /><span class="True">      80:</span>     <span class="m">int</span> <span class="b">fd</span><span class="f">,</span>
<a name="81" /><span class="True">      81:</span>     <span class="b">PyInterpreterState</span> <span class="f">*</span><span class="b">interp</span><span class="f">,</span>
<a name="82" /><span class="True">      82:</span>     <span class="b">PyThreadState</span> <span class="f">*</span><span class="b">current_tstate</span><span class="f">)</span><span class="f">;</span>
<a name="83" /><span class="True">      83:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_LIMITED_API */</span>
<a name="84" /><span class="True">      84:</span> 
<a name="85" /><span class="True">      85:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">Py_LIMITED_API</span>
<a name="86" /><span class="True">      86:</span> 
<a name="87" /><span class="True">      87:</span> <span class="k">/* Write a Unicode object into the file descriptor fd. Encode the string to</span>
<a name="88" /><span class="True">      88:</span> <span class="k">   ASCII using the backslashreplace error handler.</span>
<a name="89" /><span class="True">      89:</span> <span class="k"></span>
<a name="90" /><span class="True">      90:</span> <span class="k">   Do nothing if text is not a Unicode object. The function accepts Unicode</span>
<a name="91" /><span class="True">      91:</span> <span class="k">   string which is not ready (PyUnicode_WCHAR_KIND).</span>
<a name="92" /><span class="True">      92:</span> <span class="k"></span>
<a name="93" /><span class="True">      93:</span> <span class="k">   This function is signal safe. */</span>
<a name="94" /><span class="True">      94:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_Py_DumpASCII</span><span class="f">(</span><span class="m">int</span> <span class="b">fd</span><span class="f">,</span> <span class="b">PyObject</span> <span class="f">*</span><span class="b">text</span><span class="f">)</span><span class="f">;</span>
<a name="95" /><span class="True">      95:</span> 
<a name="96" /><span class="True">      96:</span> <span class="k">/* Format an integer as decimal into the file descriptor fd.</span>
<a name="97" /><span class="True">      97:</span> <span class="k"></span>
<a name="98" /><span class="True">      98:</span> <span class="k">   This function is signal safe. */</span>
<a name="99" /><span class="True">      99:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_Py_DumpDecimal</span><span class="f">(</span>
<a name="100" /><span class="True">     100:</span>     <span class="m">int</span> <span class="b">fd</span><span class="f">,</span>
<a name="101" /><span class="True">     101:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">value</span><span class="f">)</span><span class="f">;</span>
<a name="102" /><span class="True">     102:</span> 
<a name="103" /><span class="True">     103:</span> <span class="k">/* Format an integer as hexadecimal into the file descriptor fd with at least</span>
<a name="104" /><span class="True">     104:</span> <span class="k">   width digits.</span>
<a name="105" /><span class="True">     105:</span> <span class="k"></span>
<a name="106" /><span class="True">     106:</span> <span class="k">   The maximum width is sizeof(unsigned long)*2 digits.</span>
<a name="107" /><span class="True">     107:</span> <span class="k"></span>
<a name="108" /><span class="True">     108:</span> <span class="k">   This function is signal safe. */</span>
<a name="109" /><span class="True">     109:</span> <a href="macros_ref.html#_UHlBUElfRlVOQ18w"><span class="b">PyAPI_FUNC</span></a><span class="f">(</span><span class="m">void</span><span class="f">)</span> <span class="b">_Py_DumpHexadecimal</span><span class="f">(</span>
<a name="110" /><span class="True">     110:</span>     <span class="m">int</span> <span class="b">fd</span><span class="f">,</span>
<a name="111" /><span class="True">     111:</span>     <span class="m">unsigned</span> <span class="m">long</span> <span class="b">value</span><span class="f">,</span>
<a name="112" /><span class="True">     112:</span>     <span class="b">Py_ssize_t</span> <span class="b">width</span><span class="f">)</span><span class="f">;</span>
<a name="113" /><span class="True">     113:</span> 
<a name="114" /><span class="True">     114:</span> <span class="f">#</span><span class="n">endif</span>   <span class="k">/* !Py_LIMITED_API */</span>
<a name="115" /><span class="True">     115:</span> 
<a name="116" /><span class="False">     116:</span> <span class="f">#</span><span class="n">ifdef</span> <span class="b">__cplusplus</span>
<a name="117" /><span class="False">     117:</span> <span class="f">}</span>
<a name="118" /><span class="True">     118:</span> <span class="f">#</span><span class="n">endif</span>
<a name="119" /><span class="True">     119:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* !Py_TRACEBACK_H */</span>
<a name="120" /><span class="True">     120:</span> </pre>
  </body>
</html>
